/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package serversocket;

import com.thoughtworks.xstream.XStream;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.StringTokenizer;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Carlos
 */
public class WelcomeConexThread extends Thread {
    
    @Override
    public void run(){
        ServerSocket servicio;
        Socket socketServicio = null;
        String User;
        String Pass;
        String llego ;
        int fase = 0;
        while (fase != -1){
        try {
            servicio = new ServerSocket(9999);
            socketServicio = null;        
            socketServicio = servicio.accept();
                PrintWriter salida = new PrintWriter(socketServicio.getOutputStream(), true);
                BufferedReader entrada = new BufferedReader(new InputStreamReader(socketServicio.getInputStream()));
                llego = entrada.readLine();
                User = XmlParser.extraerContenido(llego);
                llego = entrada.readLine();
                Pass = XmlParser.extraerContenido(llego);
                try{
                    salida = comprobarRegistro(User+"."+Pass, salida);
                }catch(Exception e){
                    System.out.println("Hubo un error durante la ejecución: "+e.getMessage());
                }
                
//                if (llego.equals("Hola")){
//                    salida.println("Ok");
//                    System.out.println("Ya se conectó el servidor siguente");
//                }
                servicio.close();
            } catch (IOException ex) {
                fase = -1;
                System.out.println("Se cayó");
                System.out.println(ex.getMessage());
            }
        }
    }
    
    public PrintWriter comprobarRegistro(String llego, PrintWriter salida) {
        int acceso = 0;
        String usuario = null;
        int numeroPuerto = 0;
        
        try {
            StringTokenizer tokens = new StringTokenizer(llego, ".");
            String Nombre = tokens.nextToken();
            String Pass = tokens.nextToken();
            try {
                XStream xstream = new XStream();
                xstream.alias("Persona", Persona.class);
                BufferedReader in;
                try {
                    String dir = System.getProperty("user.dir");
                    in = new BufferedReader(new FileReader(dir + "/ListaUsuarios.xml"));
                    String s, s2 = new String();
                    try {
                        acceso = 0;
                        while ((s = in.readLine()) != null && acceso == 0) {
                            if (s.equals("</Persona>")) {
                                s2 += s + "\n";
                                System.out.println(s2);
                                Persona Usuario = (Persona) xstream.fromXML(s2);
                                if (Usuario.getNombre().equals(Nombre)) {
                                    if (Usuario.getPass().equals(Pass)) {
                                        acceso = 1;
                                        usuario = Nombre;
                                    } else {
                                        acceso = -1;
                                    }
                                }
                                System.out.println(s2);
                                s2 = "";
                            } else {
                                s2 += s + "\n";
                            }
                        }
                        in.close();
                    } catch (IOException ex) {
                        Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
                    }
                    if (acceso == 1) {
                        numeroPuerto = ListaPuertos.getInstance().abrirHilo(usuario);
                        salida.println("<mensaje>Ok</mensaje>");
                        salida.println("<puerto>"+numeroPuerto+"</puerto>");
                        System.out.println("El usuario " + Nombre + " ha ingresado al sistema.");
                    } else {
                        salida.println("<mensaje>Usuario Invalido</mensaje>");
                        salida.println("<mensaje>Usuario Invalido</mensaje>");
                    }
                } catch (Exception e) {
                    salida.println(e.getMessage());
                }
            } catch (Exception ex) {
                Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
            }
        } catch (Exception e) {
            System.out.print(e.getMessage());
        }
        return salida;
    }
    
}
